<?php

/**
 * sfUserCargaLectiva
 *
 * @package    lib
 * @subpackage lib
 * @author     David Joan Tataje Mendoza <davidtataje@gmail.com>
 */
class sfUserCargaLectiva extends sfBasicSecurityUser
{    
  public function initialize(sfEventDispatcher $dispatcher, sfStorage $storage, $options = array())
  {
    parent::initialize($dispatcher, $storage, $options);
  }
  
  public function setAuthenticated($authenticated)
  {
    if ($this->options['logging'])
    {
      $this->dispatcher->notify(new sfEvent($this, 'application.log', array(sprintf('Usuario %s fue autenticado', $authenticated === true ? '' : 'no '))));
    }
    
    $usuario = Doctrine::getTable('Usuario')->find($this->getUsuarioId());
    if ($usuario)
    {
      $usuario->setUltimoAcceso(date('Y-m-d H:i:s'));
  	  $usuario->save();
    }
    
    if ($authenticated === true)
    {
      $this->authenticated = true;
      $this->mapaPermisos();
    }
    else
    {
      $this->authenticated = false;
      
      $this->getAttributeHolder()->removeNamespace(self::CREDENTIAL_NAMESPACE);
      $this->getAttributeHolder()->removeNamespace(self::ATTRIBUTE_NAMESPACE);
      $this->getAttributeHolder()->removeNamespace(self::AUTH_NAMESPACE);
    //  $this->getAttributeHolder()->removeNamespace(self::LAST_REQUEST_NAMESPACE);
      $this->getAttributeHolder()->removeNamespace(self::CULTURE_NAMESPACE);
      $this->clearCredentials();
    }
    
    $this->storage->regenerate(false);
  }
  
  public function estaAutenticado()
  {
    return $this->authenticated;
  }
  
  public function logIn(Usuario $usuario)
  {
    $this->setAttribute('usuario_id'     , $usuario->getId()           );
    $this->setAttribute('login_usuario'  , $usuario->getLogin()        );
    $this->setAttribute('perfil_usuario' , $usuario->getNombrePerfil() );
    $this->setAttribute('docente_id'     , $usuario->getDocenteId()    );
    $this->setAuthenticated(true);
  }
  
  public function getUsuarioId()
  {
  	return $this->getAttribute('usuario_id'      , null);
  }
  public function getDocenteId()
  {
  	return $this->getAttribute('docente_id'      , null);
  }
  public function getLoginUsuario()
  {
  	return $this->getAttribute('login_usuario'    , null);
  }
  public function getPerfilUsuario()
  {
  	return $this->getAttribute('perfil_usuario'   , null);
  }
  
  public function getCurrentRouteName()
  {
  	return $this->getAttribute('current_route_name');
  }
  public function getPermisos()
  {
  	return $this->getAttribute('permisos'      , null);
  }
  
  protected function mapaPermisos()
  {
  	$usuario  = Doctrine::getTable('Usuario')->find($this->getUsuarioId());
  	$permisos = array();
  	$acciones = $usuario->getAcciones();
  	
  	foreach ($acciones as $accion)
  	{
  	  $permisos[$accion->getRuta()] = array();
  	}
  	
  	$this->setAttribute('permisos', $permisos);
  }
  
  public function tienePermisos($nombre_de_rutas, $estricto = false)
  {
  	foreach ($nombre_de_rutas as $nombre_de_ruta)
  	{
  	  if ($this->tienePermiso($nombre_de_ruta))
  	  {
  	  	if (!$estricto)
  	  	{
  	  	  return true;
  	  	}
  	  }
  	  else
  	  {
  	  	if ($estricto)
  	  	{
  	  	  return false;
  	  	}
  	  }
  	}
  	
  	if ($estricto)
  	{
  	  return true;
  	}
  	else
  	{
  	  return false;
  	}
  }
  public function tienePermiso($nombre_de_ruta)
  {
  	$nombre_de_ruta = trim($nombre_de_ruta, '@');
  	//$rutas = sfContext::getInstance()->getRouting()->getRoutes();
  	$secure = true; //TODO: hey victor check this cambiar si quieres que no sea seguro
  	
  	$permisos = $this->getPermisos();
  	if (!$secure || isset($permisos[$nombre_de_ruta]))
  	{
  	  return true;
  	}
  	
  	return false;
  }
}
